package com.dabai.iot.mqtt.topics;

import java.util.List;

/**
 * 系统主题
 *
 * @author kev1n
 */
public class SysTopics {

    /**
     * 系统前缀
     */
    public static final String PREFIX = "$SYS";

    /**
     * Topic 前缀
     */
    public static final String TOPIC_PREFIX = PREFIX + "/${productKey}/${deviceSn}";

    /**
     * 属性上报主题
     */
    public static final String PROPERTY_POST = TOPIC_PREFIX + "/thing/property/post";

    /**
     * 属性设置主题
     */
    public static final String PROPERTY_SET = TOPIC_PREFIX + "/thing/properties/set";

    /**
     * 设备序列号占位符
     */
    public static final String DEVICE_SN = "${deviceSn}";
    public static final String DEVICE_SN_ESCAPE = "\\$\\{deviceSn\\}";

    /**
     * 产品Key占位符
     */
    public static final String PRODUCT_KEY_ESCAPE = "\\$\\{productKey\\}";

    /**
     * 获取系统主题
     */
    public static List<TopicDefinition> getDefaultSysTopics() {
        return List.of(
            new TopicDefinition(
                PROPERTY_POST,
                TopicDirection.PUB,
                "设备上报属性数据"
            ),
            new TopicDefinition(
                PROPERTY_SET,
                TopicDirection.SUB,
                "平台给设备设置属性"
            )
        );
    }

    // TODO: 可以重新定义

    /**
     * 服务端订阅 - 设备数据 topic
     * <p>
     * 服务端连接时会订阅 $SYS/${tenantId}/${groupID}/update 主题
     */
    public static String getDataTopic(String tenantId, String groupID) {
        return "$SYS/" + tenantId + "/" + groupID + "/update";
    }

    /**
     * 服务端订阅 - 设备状态 topic
     * <p>
     * 服务端连接时会订阅 $SYS/${tenantId}/${groupID}/status 主题
     */
    public static String getStatusTopic(String tenantId, String groupID) {
        return "$SYS/" + tenantId + "/" + groupID + "/status";
    }

    /**
     * 服务端发布 topic
     */
    public static String getServerPubTopic(String tenantId, String groupID) {
        return "$SYS/" + tenantId + "/" + groupID + "/publish";
    }

}
